package org.wangp.montior.log.test

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import org.elasticsearch.index.query.QueryBuilders
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.annotation.Id
import org.springframework.data.elasticsearch.annotations.Document
import org.springframework.data.elasticsearch.annotations.Field
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate
import org.springframework.data.elasticsearch.core.geo.CustomGeoModule
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder
import org.springframework.test.context.junit4.SpringRunner
import org.wangp.framework.core.util.infoAny
import org.wangp.framework.elasticsearch.domain.BaseDOEs
import org.wangp.montior.log.LogCenterApplication
import org.wangp.montior.log.repository.es.LogEsRepo
import java.time.LocalDateTime
import java.util.concurrent.LinkedBlockingQueue
import javax.annotation.Resource

/**
 * @author wangpeng (๑•ᴗ•๑)
 * @since 2021/10/15 3:53
 */
@SpringBootTest(classes = [LogCenterApplication::class])
@RunWith(SpringRunner::class)
class LogTest {

	companion object {
		val log: Logger = LoggerFactory.getLogger(LogTest::class.java)
		const val KEYWORD_SUFFIX = ".keyword"
	}

	@Resource
	private lateinit var elasticsearchRestTemplate: ElasticsearchRestTemplate

	@Resource
	private lateinit var logEsRepo: LogEsRepo

	@Resource
	private lateinit var objectMapper: ObjectMapper

	@Before
	fun configuration() {
		objectMapper.registerModule(CustomGeoModule())
		objectMapper.registerModule(JavaTimeModule())
	}

	@Before
	fun prepareIndex() {
		val indexOps = elasticsearchRestTemplate.indexOps(Article::class.java)
		if (!indexOps.exists()) indexOps.create()
	}

	@Test
	fun searchTest() {
		val result = elasticsearchRestTemplate.search(
			NativeSearchQueryBuilder()
				.withQuery(QueryBuilders.termQuery(Article::author.name + KEYWORD_SUFFIX, "出处"))
				.build(),
			Article::class.java
		).toList()
		log.infoAny(result)
	}

	@Test
	fun save() {
		for (i in 1..10) {
			elasticsearchRestTemplate.save(
				mutableListOf(
					Article(
						content = """
						假的，你读到100%，接着会让你累积提现100元的碎片，那碎片你是永远都累积不成功的，而且你只能看着那“不能提现的金额”渐渐增多，等你账面（不能提现）的金额累积到3百多元，它又会弹出一个限期，让你限期内提现，而碎片永远在叠加却提现不了，而提现不了过期就会清零。所以说，米读提现100元是假的!我是亲身经历者，建议如果追逐那提现100元的读者，卸载米读和米读相关的APP。

						作者：Tom
						链接：https://www.zhihu.com/question/395918752/answer/2092702998
						来源：知乎
						著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
					""".trimIndent(),
						title = """米读极速版最近有下载送100元读完一整本书可以提现到微信的活动，有没有人提出来了，这个活动是真实的吗？""",
						author = "Tom",
					).apply {
						created = LocalDateTime.now()
						creator = "Tom"
					},
					Article(
						content = """
						才看到这个活动才看到了这个活动，用了脚本挂机，刷了一个晚上，刷完了一本书，明确的告诉你们，这个活动不算真实，前面几个累积登录就可以提现，50%进度的4.5元需要登陆七天还有邀请一位新好友，最后100元是真的提现不了，又会出现一个，需要让你攒够0.3元才能提现（我的理解是：通过完成某些任务，看小说之类的，逐步获得现金，满0.3元就可以提现，直到提现完剩余待提现金额），所以这个活动不算假的，也不算真的（就看你怎么去理解，和你愿不愿意做接下来的任务）提现门槛有点高，有这时间刷小说还不如去刷刷视频之类的，刷视频这些赚钱APP，比这个要靠谱一些（周围的朋友用的基本上都是刷视频的APP赚钱，用米读极速版很多都是体现了4.5元之后果断卸载）我在度娘，还有别的搜索软件上，包括一些社交软件，没有看到有人提现过全部剩余金额的，我建议要是有想看的小说，玩一玩也是可以的，不要对提现全部抱有太大希望

						作者：浩翔
						链接：https://www.zhihu.com/question/395918752/answer/1309384002
						来源：知乎
						著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
					""".trimIndent(),
						title = "米读极速版最近有下载送100元读完一整本书可以提现到微信的活动，有没有人提出来了，这个活动是真实的吗？",
						author = "浩翔"
					).apply {
						created = LocalDateTime.now()
						creator = "浩翔"
					}
				)
			)
		}
	}

	@Test
	fun delete() {
		LinkedBlockingQueue<String>().offer("")
		elasticsearchRestTemplate.delete(
			NativeSearchQueryBuilder().withQuery(
				QueryBuilders.matchQuery(Article::content.name, "希望")
			).build(),
			Article::class.java,
			IndexCoordinates.of("article")
		)
		elasticsearchRestTemplate.delete(
			NativeSearchQueryBuilder().withQuery(
				QueryBuilders.matchQuery(Article::content.name, "假的")
			).build(),
			Article::class.java,
			IndexCoordinates.of("article")
		)
	}

	@Document(indexName = "article", createIndex = true)
	data class Article(
		@Id
		var esId: String? = null,
		@Field
		var content: String? = null,
		@Field
		var title: String? = null,
		@Field
		var author: String? = null
	) : BaseDOEs() {
		override fun toString(): String {
			return "Article(esId=$esId, content=$content, title=$title, author=$author) ${super.toString()}"
		}
	}

	@Test
	fun reversal() {
	}
}
